package com.sky.task;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.sky.constant.CacheConstant;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 定时任务：统计热门菜品ID，存入本地缓存
 */
@Component
@Slf4j
public class HotStatisticsTask {

    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;

    //菜品缓存预热数
    private static final int HOT_DISH_COUNT = 20;
    //套餐缓存预热数
    private static final int HOT_SETMEAL_COUNT = 20;

    // 本地缓存：key=固定标识（如"hot_dish_ids"），value=热门菜品ID列表（销量TOP20）
    private final Cache<String, List<Long>> hotDishCache = Caffeine.newBuilder()
            .expireAfterWrite(2, TimeUnit.HOURS) // 缓存2小时，与定时任务周期（1小时）错开，避免空窗
            .build();
    private final Cache<String, List<Long>> hotSetmealCache = Caffeine.newBuilder()
            .expireAfterWrite(2, TimeUnit.HOURS)
            .build();
    /**
     * 定时统计：每1小时执行一次（避开高峰期，如凌晨2点、3点...）
     */
    @Scheduled(cron = "0 0 */1 * * ?")
    public void statisticsHotDishIds() {
        log.info("开始统计热门菜品ID");
        // 1. 查询销量TOP20的菜品ID
        List<Long> hotDishIds = dishMapper.getHotDishIds(HOT_DISH_COUNT);
        // 2. 存入本地缓存（key用固定值，方便AOP查询）
        hotDishCache.put(CacheConstant.HOT_DISH_ID_CACHE, hotDishIds);
        log.info("热门菜品ID统计完成，共{}个菜品", hotDishIds.size());
    }

    /**
     * 定时统计：每1小时执行一次（避开高峰期，如凌晨2点、3点...）
     */
    @Scheduled(cron = "0 0 */1 * * ?")
    public void statisticsHotSetmealIds() {
        log.info("开始统计热门套餐ID");
        // 1. 查询销量TOP20的套餐ID
        List<Long> hotSetmealIds = setmealMapper.getHotSetmealIds(HOT_SETMEAL_COUNT);
        // 2. 存入本地缓存（key用固定值，方便AOP查询）
        hotSetmealCache.put(CacheConstant.HOT_SETMEAL_ID_CACHE, hotSetmealIds);
        log.info("热门套餐ID统计完成，共{}个套餐", hotSetmealIds.size());
    }

    /**
     * 对外提供查询：判断某个菜品ID是否是热门
     */
    public boolean isHotDish(Long dishId) {
        if (dishId == null) {
            return false;
        }
        // 从缓存获取热门ID列表
        List<Long> hotDishIds = hotDishCache.getIfPresent(CacheConstant.HOT_DISH_ID_CACHE);
        // 若列表为空（如首次启动未统计完成），默认不视为热门（避免AOP误判）
        return hotDishIds != null && hotDishIds.contains(dishId);
    }

    /**
     * 对外提供查询：判断某个套餐ID是否是热门
     */
    public boolean isHotSetmeal(Long setmealId) {
        if (setmealId == null) {
            return false;
        }
        // 从缓存获取热门ID列表
        List<Long> hotSetmealIds = hotSetmealCache.getIfPresent(CacheConstant.HOT_SETMEAL_ID_CACHE);
        // 若列表为空（如首次启动未统计完成），默认不视为热门（避免AOP误判）
        return hotSetmealIds != null && hotSetmealIds.contains(setmealId);
    }

}